package com.example.zz.example.network;


import com.example.zz.example.network.bean.BasePageRes;
import com.example.zz.example.network.bean.BaseRes;
import com.example.zz.example.network.bean.UpdateParams;
import com.example.zz.example.network.bean.WangYiNews;

import java.util.List;
import java.util.Map;

import io.reactivex.Observable;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.Headers;
import retrofit2.http.POST;
import retrofit2.http.Path;
import retrofit2.http.Query;
import retrofit2.http.QueryMap;

public interface NewsService {
    //https://api.apiopen.top/getJoke?page=1&count=2&type=text


    //    对于 GET 请求的参数，你可以通过以下几种方式添加参数，推荐前两种，第二种最灵活
    //     1、使用 @Query 注解逐个添加
    @GET("endpoint")
    Observable<ResponseBody> getEndpointData(@Query("param1") String param1, @Query("param2") int param2);

    //    2、使用 @QueryMap 注解传递参数映射
    @GET("endpoint")
    Observable<ResponseBody> getEndpointData(@QueryMap Map<String, String> queryParams);

    //    3、使用 URL 参数占位符
    @GET("users/{userId}")
    Observable<ResponseBody> getUserById(@Path("userId") int userId);
    //    4、在 URL 中直接拼接参数
    @GET("endpoint?param1=value1&param2=value2")
    Observable<ResponseBody> getEndpointData();


    // POST 请求种类
    // 表单数据（Form Data）：
    //这是最常见的POST请求参数类型，它包含了用户在表单中输入的数据，如文本字段、复选框、单选按钮等。这些数据通常以键值对的形式进行封装，然后作为请求体发送到服务器。
    //在HTTP请求中，表单数据通常使用Content-Type: application/x-www-form-urlencoded或Content-Type: multipart/form-data（当需要上传文件时）来表示。
    //JSON数据：
    //JSON（JavaScript Object Notation）是一种轻量级的数据交换格式，易于人阅读和编写，同时也易于机器解析和生成。在POST请求中，JSON数据常用于API调用，如提交订单、用户信息等复杂数据结构。
    //发送JSON数据时，HTTP请求的Content-Type通常设置为application/json。
    //XML数据：
    //XML（Extensible Markup Language）是一种用于存储和传输数据的标记语言。在POST请求中，XML数据常用于提交大量数据或配置文件。
    //发送XML数据时，HTTP请求的Content-Type通常设置为application/xml。
    //二进制数据：
    //二进制数据如图像、视频和音频文件等，可以作为POST请求的参数发送到服务器。这通常用于文件上传功能。
    //在处理二进制数据时，需要注意文件的编码和传输方式，以确保数据的完整性和安全性。
    //纯文本数据：
    //纯文本数据通常用于向服务器提交较小的文本信息，如搜索关键字、简单的用户输入等。
    //纯文本数据的格式通常是text/plain。


    // POST 请求参数类型
    //   1、RequestBody 传入参，这是原始方法
    //   在这种情况下，你需要使用RequestBody.create方法（或相应的其他方法）来创建RequestBody实例。例如，如果你想要设置自定义的媒体类型或使用自定义的序列化逻辑
    //    JSONObject jsonObject = new JSONObject();
    //        try {
    //        jsonObject.put("sn", sn);
    //    } catch (
    //    JSONException e) {
    //        throw new RuntimeException(e);
    //    }
    //    RequestBody body = RequestBody.create(
    //            MediaType.parse("application/json; charset=utf-8"),
    //            jsonObject.toString // 这里是JSON格式的字符串上面使用的jsonObject进行格式化为json，也可以使用gson进行格式化
    //    );
    //    Call<UserResponse> call = myApiService.registerUser(body);
    @POST("users/register")
    Call<ResponseBody> registerUser(@Body RequestBody user);

    //   2、自己根据参数定义对象做入参
    //   Retrofit会使用其配置的转换器（如GsonConverterFactory）自动将User对象转换为JSON格式的RequestBody。这意味着你不需要手动将对象转换为JSON字符串或创建RequestBody实例。Retrofit会为你做这些工作。
    @POST("users/register")
    Call<ResponseBody> registerUser(@Body WangYiNews user);


    //使用表单数据（Form Data）请求类型
    //区别就是添加  @FormUrlEncoded注解，并使用 @Field 注解来标记方法的参数；Retrofit 会将这些参数及其值转换成一个表单格式的字符串，并在发送请求时设置正确的 Content-Type 为 application/x-www-form-urlencoded。这样，服务器就能正确地解析这些参数了。
    @FormUrlEncoded
    @POST("users/register")
    Call<ResponseBody> submitFormData(
            @Field("param1") String value1,
            @Field("param2") String value2,
            @Field("param3") String value3,
            // ... 可以继续添加更多的@Field注解
            @Field("paramN") String valueN
    );

    //也可以使用最原始方式，不是用@FormUrlEncoded注解，使用RequestBody进行构造
    //String rawData = "your raw data here";
    //MediaType MEDIA_TYPE_TEXT = MediaType.parse("application/x-www-form-urlencoded");
    //RequestBody requestBody = RequestBody.create(MEDIA_TYPE_TEXT, rawData);
    //
    //Call<MyResponse> call = myApiService.postRawData(requestBody);

    //表单也提供了相对原始的，formBody 是一个 FormBody 类型的 RequestBody，它包含了表单数据，并且其 Content-Type 会自动设置为 application/x-www-form-urlencoded
    //FormBody.Builder formBuilder = new FormBody.Builder();
    //formBuilder.add("key1", "value1");
    //formBuilder.add("key2", "value2");
    //// ... 添加更多表单字段
    //RequestBody formBody = formBuilder.build();
    //Call<YourResponse> call = myApiService.submitFormData(formBody);
    @POST("endpoint")
    Call<ResponseBody> postRawData(@Body RequestBody requestBody);






    //====================================================================================================================================================
    /**
     * Retrofit网络请求测试
     *
     * @param count
     * @param page
     * @param type
     * @return
     */
    @GET("getJoke")
    Call<ResponseBody> getJokeList(@Query("page") int page,
                                   @Query("count") int count,
                                   @Query("type") String type);

    /**
     * Retrofit和Rxjava结合网络请求测试
     *
     * @param count
     * @param page
     * @param type
     * @return
     */
    @GET("getJoke")
    Observable<ResponseBody> getJokeList2(@Query("page") int page,
                                          @Query("count") int count,
                                          @Query("type") String type);


    /**
     * Retrofit网络请求实战，测试网易新闻api
     *
     * @param count
     * @param page
     * @return
     */
    @POST("getWangYiNews")
    Call<ResponseBody> getWangYiNews(@Query("page") int page,
                                     @Query("count") int count);

    /**
     * 更新预订单状态
     * http://localhost:9999/cyPreOrder/updateStatus
     */
    @POST("cyPreOrder/updateStatus")
    Call<ResponseBody> updatePreOrderStatus(@Body UpdateParams updateParams);

    /**
     * "/rc-charge-service/api/charge/domain/FeeExternalInterface/v1/cateringBillInterface"
     */
    @Headers({"Content-Type: application/json","Accept: application/json"})//添加头
    @POST("/rc-charge-service/api/charge/domain/FeeExternalInterface/v1/cateringBillInterface")
    Call<ResponseBody> wsPostBody(@Body Object var2);



    //通过observer进行接收，然后直接进行rxjava进行线程切换，下面是响应体中包装三种类型：响应体包含指定对象，响应体包含不确定对象，响应体包含集合

    @GET("/ccloudapp/resident/WangYiNews")
    Observable<BaseRes<WangYiNews>> getResidentListByRoomId(@Query("roomId") String roomId);

    @POST("/scrm/daysSchedule/list")
    Observable<BaseRes<BasePageRes<WangYiNews>>> getDaysScheduleList(@Body RequestBody body);

    @POST("/ccloudapp/api/smartSpeaker/getArticle")
    Observable<BaseRes<List<WangYiNews>>> getCloudArticle(@Body RequestBody body);

}
